package com.ytjj.qmyx.data.util;

import java.util.concurrent.ThreadLocalRandom;

public class RandonUtils {

    /**
     * 生成指定范围的随机double数字
     * @param min 最小值
     * @param minReach 最小值是否可以取到（true-可以）
     * @param max 最大值
     * @param maxReach 最大值是否可以取到（true-可以）
     * @return 符合要求的随机数
     */
    public static double genDoubleNumber(double min, boolean minReach, double max, boolean maxReach) {
        double num;
        if(minReach) {
            // [min, max]
            if(maxReach) {
                // todo 虽然涉及循环，但是目前没有找到不降低取值密度的写法
                // 使用取余数之类带整型的写法，基本都会降低取值密度
                do {
                    // 该公式的取值范围是：[min, max + 0.001)
                    num = ThreadLocalRandom.current().nextDouble(min, max + 0.001);
                } while(num > max); // 排除掉取值大于max的情况，剩下的就是符合要求的值了
            } else { // [min, max)
                // num = min + Math.random() * (max - min); // 方式一
                num = ThreadLocalRandom.current().nextDouble(min, max); // 方式二
            }
        } else {
            // (min, max]
            if(maxReach) {
                num = max - Math.random() * (max - min);
            } else { // (min, max)
                num = Math.random() + (max - 1 - Math.random() * (max - min - 1));
            }
        }
        return num;
    }

    public static void main(String[] args) {
//        double v = genDoubleNumber(0.445, true, 0.455, true);
        double v1 = ThreadLocalRandom.current().nextDouble(0.445, 0.455);
        System.out.println("v = " + v1);
    }
}
